// 常量定义
// 投标列表页面的URL
var loanlistURL = "http://www.renrendai.com/lend/loanList.action";
// 具体某个标的页面URL，使用时在后面加上对应标的ID即可
var detailPageURL = "http://www.renrendai.com/lend/detailPage.action?loanId=";




// define HTTP请求发送接收棋块
// 发送请求次数统计
var count = 0;

// 发送HTTP请求函数，返回值为接收到的请求
function sendRequest(){
	setText("第" + count++ + "次发送请求");

	var text;
	$.ajax({
		url: loanlistURL,
		async: false,
		success: function(data){
			text = data;
		}
	});
	return text;
}

// 字符串处理，截取返回结果中的投标列表json字符串，并转换为json格式
function getLoanlistJsonFromResponse(text){
	var startText = "<script id=\"loan-list-rsp\" type=\"text/x-json\">";
	var endText = "</script>";
	
	var startIndex = text.indexOf(startText) + startText.length;
	var endIndex = text.indexOf(endText, startIndex); // search from startIndex

	var jsonString = text.substring(startIndex, endIndex);

	var json = JSON.parse(jsonString);
	
	return json;
}
// end HTTP请求发送接收棋块




// define 规则模块
//     1. 定义了当前插件的状态：运行(start)或停止(stop)
//     2. 定义了搜索投标的规则
//     3. 定义了搜索投标的过滤执行函数

// 定义当前插件的状态
function WorkingStatus(){
	// 当前插件的工作状态，包含start和stop，默认一开始为stop
	this.status = "stop";
	
	// 设置当前插件状态
	this.setStatus = function(status){
		this.status = status;
	}
	
	// 获取当前的插件状态
	this.getStatus = function(){
		return this.status;
	}
}
// 插件状态实例化
var workingStatus = new WorkingStatus();

// 定义搜索投标的规则
function Rules(){
	// 按钮的规则，OPEN=投标，FIRST_READY=已满标，IN_PROGRESS=还款中
	this.buttonRule = new Array("OPEN","FIRST_READY", "IN_PROGRESS");
	// 期数的规则，最小月份，默认为3个月
	this.monthRuleMin = 3;
	// 期数的规则，最大月份，默认为24个月
	this.monthRuleMax = 24;
	
	// 获取当前规则
	this.getButtonRules = function(){	return this.buttonRule;	};
	// 设置当前规则
	this.setButtonRules = function(rules){ 
		console.log(rules);
		if($.isArray(rules)){
			this.buttonRule = rules;
		}
	};
	// 添加一条规则
	this.addButtonRule = function(rule){
		if($.inArray(rule, this.buttonRule) == -1/*找不到元素返回-1*/){
			this.buttonRule.push(rule);
		}
	};
	// 删除一条规则
	this.removeButtonRule = function(rule){
		var index = $.inArray(rule, this.buttonRule);
		if( index >= 0){
			this.buttonRule.splice(index/*起始位置*/, 1/*删除元素个数*/);
		}
	};
	
	// 获取最小期数
	this.getMonthRuleMin = function(){	return this.monthRuleMin;	};
	// 设置最小期数
	this.setMonthRuleMin = function(month){	
		console.log(month);
		this.monthRuleMin = month;
	};
	// 获取最大期数
	this.getMonthRuleMax = function(){	return this.monthRuleMax;	};
	// 设置最大期数
	this.setMonthRuleMax = function(month){
		console.log(month);
		this.monthRuleMax = month;	
	};
	
	// 规则匹配，检查某个json是否满足当前规则，传入值为json，返回匹配（true）或不匹配（false）
	this.matchRules = function(json){
		var month = json.months;
		var button = json.status;
		
		if(month >= this.monthRuleMin &&
			month <= this.monthRuleMax &&
			$.inArray(button, this.buttonRule) >= 0 ){
				return true;
		} else {
			return false;
		}
	}
}
// 实例化
var rules = new Rules();

// 从json对象中按照规则过滤出满足条件的投标Id，返回一个id数组
function getLoanIdsFromJson(json){
	var loanIds = new Array();
	
	var loansArray = json.data.loans;
	for(var i=0; i<loansArray.length; ++i){
		var loan = loansArray[i];
		
		if(rules.matchRules(loan)){
			loanIds.push(loan.loanId);
		}
	}
	
	return loanIds;
}

// end 规则模块




// define 浏览器行为
// 打开新的标签页
function openNewTab(url){
	chrome.tabs.create({"url": url});
}
// 使用弹窗的方式通知用户，因为这个东西是在后台跑的，刷到标需要通知用户，以免错过
function notifyPeople(message){
	alert(message);
}
// 将文本显示到界面上
function setText(text){
	chrome.runtime.sendMessage({"text": text});
}
// end 浏览器行为 




// define 流程控制模块
// 后台提供的启动接口
function doStart(){
	workingStatus.setStatus("start");
	// 不直接调用而使用setTimeout方式主要是为了改变处理的逻辑，
	// 我们知道js其实是单线程的，在单线程的程序中模仿一个线程执行的样子需要改变程序执行的顺序
	// 使用setTimeout的方式向处理队列中加入一个待执行的函数，可以使这个函数后面的代码先被执行，然后再轮到business函数的执行
	setTimeout(business, 0);
}
// 主业务逻辑函数
function business(){
	// 发送请求并得到响应
	var response = sendRequest();
	// 从响应文本中取出对应的json对象
	var loanlistJson = getLoanlistJsonFromResponse(response);
	console.log(loanlistJson);
	// 查看json对象中是否有满足条件的投标，得到一个满足条件的数组，数组内容为投标id
	var loanIds = getLoanIdsFromJson(loanlistJson);

	// 如果数组中有内容，则执行相应的行为
	if( loanIds.length == 1 ) {
		openNewTab(detailPageURL + loanIds[0]);
		notifyPeople("请投标");
		doStop();
	} else if ( loanIds.length > 1 ){
		openNewTab(loanlistURL);
		notifyPeople("有多个标");
		doStop();
	}
	
	// 根据启动停止的状判断是否
	if(workingStatus.getStatus() == "start"){
		// 请见doStart函数中调用方式的解释
		setTimeout(business, 0);
	}
}
// 后台提供的停止接口
function doStop(){
	workingStatus.setStatus("stop");
}
// end 流程控制模块